package config

import (
	"fmt"
	"gopkg.in/yaml.v3"
	"log"
	"os"
	"poem-server/resources/config"
)

// ServerConfig 配置信息
type ServerConfig struct {
	Elastic config.Elastic `yaml:"elastic"`
	Mysql   config.Mysql   `yaml:"mysql"`
	Redis   config.Redis   `yaml:"redis"`
	Profile config.Profile `yaml:"profile"`
	Jwt     config.Jwt     `json:"jwt" yaml:"jwt"` //TODO 这里删了一个mapstructure
	Sms     config.Sms     `yaml:"sms"`
	Log     config.Log     `yaml:"log"`
	Storage config.Storage `yaml:"storage"`
}

func NewServerConfig() ServerConfig {
	return ServerConfig{}
}

var Config = ServerConfig{}
var Envconfig = config.EnvConfig{}
var currentDir, _ = os.Getwd() //项目路径

func (s ServerConfig) Load() {

	// TODO 读取到yaml代表配置文件的字符串
	env := s.SwitchEvn()
	var err error

	file := fmt.Sprintf("%s\\resources\\application-%s.yaml", currentDir, env)
	evnBytes, err := os.ReadFile(file)
	if err != nil {
		log.Panic("读取配置文件失败")
	}
	// TODO 解析yaml文件 并把解析到的数据解析到实体类中
	// TODO 把这个实体类设为全局变量 程序中就都可以读到yaml中数据
	err = yaml.Unmarshal(evnBytes, &Config)
	if err != nil {
		fmt.Println("解析 yaml 文件失败：", err)
		return
	}

	log.Printf("ymal文件映射成功，%v", Config)
}

// 读取配置环境
func (s ServerConfig) SwitchEvn() string {
	// TODO 环境配置路径
	currentDir, _ := os.Getwd()
	file := currentDir + "\\resources\\application.yaml"

	// TODO 读取配置yaml文件，并把环境值赋给evnConfig
	dataBytes, err := os.ReadFile(file)
	if err != nil {
		log.Panic("==========>读取环境配置失败", err)
	}
	//读取application 里的profile环境配置 选择 local prod 等
	err = yaml.Unmarshal(dataBytes, &Envconfig)

	fmt.Printf("==========>环境读取到%v\n", Envconfig.Profile.Env)
	// TODO 返回解析到的yaml配置文件名
	return Envconfig.Profile.Env
}
